// // 普通装饰器
// function Path(target:any){
//     console.log('1111');
    
// }
// @Path
// class Hello{

// }

// // 装饰器工厂
// function color(value:string){
//     // 这是装饰器工厂
//     return  function(target){
//         // 这是装饰器
//         do something with 'target' and 'value'...
//     }
// }

// 类装饰器
// function Path(path:string){
//     return  function (target:Function){
//         target.prototype.baseUrl=path
//     }
// }

// @Path('/hello')
// class Hello{
//     baseUrl:string
// }
// console.log(Hello.prototype.baseUrl);
// let htllo=new Hello()

// 方法装饰器
// function get(params:any){
//     return  function(target:any,methodName:any,desc:any){
//         // 扩展属性
//         target.apiUrl=params;
//         // 扩展方法
//         target.run=function(){
//             console.log('run');
//         }
//         // 修饰类装饰器的方法，把装饰器方法里面传入的参数都改为string类型
//         // 保存当前方法
//         let Method = desc.value;
//         // 改方法 
//         desc.value=function(...arr:any[]){
//             arr=arr.map(e=>{
//                 return  String(e)
//             })
//             // 调用未改写的方法
//             Method.apply(this,arr)
//         }

//     }
// }

// class Http{
//     public url:any|undefined;
//     constructor(){

//     }
//     @get('/home')
//     getDate(...arr:any[]){
//         console.log('方法');
        
//     }
// }
// let http = new Http();


// 属性装饰器
// function Deful(value:string){
//     return  function(target:any,propertyName:string){
//         target[propertyName]=value;
//     }
// }

// class Hello{
//     @Deful('world') greeting!:string
// }
// console.log(new Hello().greeting); //输出world

// 函数参数装饰器
// function Path(paramName:string){
//     return  function(target:any,methodName:string,paramIndex:number){
//         !target.$Meta&&(target.$Meta={});
//         target.$Meta[paramIndex]=paramName
//     }
// }

// class Hello{
//     constructor(){
//         getUser(@Path('userId') userId:string){ }
//     }
// }
// console.log((<any>HelloService).prototype.$Meta); // {'0':'userId'}